package com.learn.project2.service.admin.stat;

import com.github.pagehelper.util.StringUtil;
import com.learn.project2.bean.MarketGoods;
import com.learn.project2.bean.MarketOrderGoods;
import com.learn.project2.mapper.MarketGoodsMapper;
import com.learn.project2.mapper.MarketOrderGoodsMapper;
import com.learn.project2.mapper.MarketOrderMapper;
import com.learn.project2.mapper.MarketUserMapper;
import com.learn.project2.model.vo.admin.stat.StatGoodsVO;
import com.learn.project2.model.vo.admin.stat.StatOrderVO;
import com.learn.project2.model.vo.admin.stat.StatUserVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.math.BigDecimal;
import java.util.*;

/**
 * @Author: 尹圣淼
 * @Date: 2022/1/7 21:46
 * <p>
 * <p>
 * Map :  一大弊端： 并不按照添加的顺序输出（随即顺序）。 草拟🐎
 */
@Service
public class StatServiceImpl implements StatService {

    @Autowired
    MarketUserMapper marketUserMapper;

    @Autowired
    MarketOrderMapper marketOrderMapper;

    @Autowired
    MarketOrderGoodsMapper marketOrderGoodsMapper;

    @Override
    public StatUserVO userShow() {
        // 只能区分出同一时刻 （秒都一样的）
        String[] distinctDates = marketUserMapper.selectDistinctDates();
        // String []distinctDays;
        if (distinctDates == null) {
            return null;
        }
        StatUserVO statUserVO = new StatUserVO();
        ArrayList<String> columns = new ArrayList<>();
        columns.add("day");
        columns.add("users");
        statUserVO.setColumns(columns);
        // 用hashMap接收 重复的年月日不许二次添加。
        // key 年月日  value就是对应的模糊查询到的users
        HashMap<String, Integer> map = new LinkedHashMap<>();
        List<StatUserVO.RowsBean> rowsBeans = new ArrayList<>();
        ;
        // 将值装入对象。
        String day = null;
        for (String distinctDate : distinctDates) {
            // 只截取字符串的前十位， ->  我进行区分 前十位不同的。
            // 比较上一次的。 与上次天数相同的话 并不遍历。
            if (distinctDate == null || distinctDate.substring(0, 10).equals(day))
                continue;
            day = distinctDate.substring(0, 10);  // 左闭右开。key重复就覆盖，无所谓。不冗余就好
            // 根据年月日的不同，进行划分user 进入不同日期打头的数组。
            map.put(day, marketUserMapper.selectUsersByDay(day));
            Integer users = map.get(day);
            StatUserVO.RowsBean rowsBean = new StatUserVO.RowsBean();
            rowsBean.setDay(day);
            rowsBean.setUsers(users);
            rowsBeans.add(rowsBean);
        }

        //------------------------------------------------------

        statUserVO.setRows(rowsBeans);
        return statUserVO;
    }

    @Override
    public StatOrderVO orderShow() {
        StatOrderVO statOrderVO = new StatOrderVO();
        ArrayList<String> columns = new ArrayList<>();
        columns.add("day");
        columns.add("orders");
        columns.add("customers");
        columns.add("amount");
        columns.add("prc");
        statOrderVO.setColumns(columns);
        // --------------------------------------------------------------

        String[] distinctDates = marketOrderMapper.selectDistinctDates();
        if (distinctDates == null) {
            return null;
        }
        // 用hashMap接收 重复的年月日不许二次添加。
        // key 年月日  value就是对应的模糊查询到的users
        HashMap<String, StatOrderVO.RowsBean> map = new LinkedHashMap<>();
        List<StatOrderVO.RowsBean> rowsBeans = new ArrayList<StatOrderVO.RowsBean>();
        String day = null;
        for (String distinctDate : distinctDates) {
//            // 只截取字符串的前十位， ->  我进行区分 前十位不同的。
            if (distinctDate == null || distinctDate.substring(0, 10).equals(day))
                continue;
            day = distinctDate.substring(0, 10);  // 左闭右开。key重复就覆盖，无所谓。不冗余就好
//            // 根据年月日的不同，进行划分订单量(order_id)，下单用户数(user_id) 订单金额。
//            //             进入不同日期打头的数组。
            StatOrderVO.RowsBean rowsBean = new StatOrderVO.RowsBean();
            rowsBean.setAmount(marketOrderMapper.selectSumOfAmountsByDay(day));
            rowsBean.setCustomers(marketOrderMapper.selectCustomersByDay(day));
            rowsBean.setDay(day);
            rowsBean.setOrders(marketOrderMapper.selectOrdersByDay(day));
            rowsBean.setPrc(rowsBean.getAmount() / rowsBean.getCustomers());
            rowsBeans.add(rowsBean);
        }
        // 遍历map 得到干净的数据。  用 arrayList线性表接收。
        // 线性表直接进入对象。
        statOrderVO.setRows(rowsBeans);
        //  返回对象。
        return statOrderVO;
    }

    @Override
    public StatGoodsVO goodsShow() {
        StatGoodsVO statGoodsVO = new StatGoodsVO();
        // 先赋值字符串{"day","orders","products","amount"}
        List<String> columns = new ArrayList<>();
        columns.add("day");                          // 日期
        columns.add("orders");                       // orders 订单量
        columns.add("products");                     // products  下单货品数量。
        columns.add("amount");                       // amount 下单货品总额。
        statGoodsVO.setColumns(columns);
        // ----------------------------------------
        // 通过日期拿到当天的orders
        HashMap<String, StatGoodsVO.RowsBean> map = new HashMap<>();
        List<String> distinctDates = marketOrderGoodsMapper.selectDistinctDates();
        if (distinctDates == null) {
            return null;
        }
        double sum = 0;
        String day = null;
        ArrayList<StatGoodsVO.RowsBean> rowsBeans = new ArrayList<>();
        for (String distinctDate : distinctDates) {
            sum = 0;
            if (distinctDate == null || distinctDate.substring(0, 10).equals(day))
                continue;
            day = distinctDate.substring(0, 10);// 左闭右开。
            // 根据day进行查询语句。取出
            //  orders(count(order_id) 即可 ), 订单数量。
            Integer orders = marketOrderGoodsMapper.selectOrdersByDay(day);
            Integer products = marketOrderGoodsMapper.selectNumbersOfGoodsByDay(day);
            //  products (每行的number加上即可）

            //  ammount(这个需要自己搞,该行的number和price相乘获得)
            // 根据day 得到主键id  主键id拿到没啥用。直接按照day查询到number，price; 不能用HashMap
            // 所以id是 List<Integer> ids = marketGoodsMapper.selectIdsByDay(day);
            // selectNumberById  selectPriceById;  通过拿对象get即可。
            // 每天day的循环 遍历id们 然后拿到对应的number和price 相乘作和。 sum+=  ;
            List<Integer> ids = marketOrderGoodsMapper.selectPrimarysByDay(day);
            for (Integer id : ids) {
                MarketOrderGoods marketOrderGoods = marketOrderGoodsMapper.selectByPrimaryKey(id);
                int number = marketOrderGoods.getNumber();
                Double price = marketOrderGoods.getPrice();
                sum += price * number;
            }
            StatGoodsVO.RowsBean rowsBean = new StatGoodsVO.RowsBean();
            rowsBean.setAmount(sum);
            rowsBean.setDay(day);
            rowsBean.setOrders(orders);
            rowsBean.setProducts(products);
            rowsBeans.add(rowsBean);
        }

        statGoodsVO.setRows(rowsBeans);
        return statGoodsVO;
    }


}
